home *** CD-ROM | disk | FTP | other *** search
- Procedure ReadP (Var NewIn : String; OldIn : String; X,Y,Colr : Byte;
- FChar : Char; ValidChars : ChSet; Patrn : String);
-
- (* NewIn = Variable containing data entered by user
- OldIn = Default input string
- X,Y = Coordinates to begin reading
- FChar = Fill character at End-of-String
- ValidChars = Set of Char of characters valid for input
- (in some cases is redundant)
- Patrn = String containing three different chars:
- 'X's for blank space (no data)
- '#'s for numbers only
- '@'s for alpha characters only
- '%'s for both alpha & numeric
- characters *)
-
- (* When calling ReadP, the prompt should already be on-screen. X,Y locates
- the point to begin the reading. When ReadP returns a value in NewIn,
- please note that a pattern of '###X###X####' will be returned looking like
- '##########'. The X's do not denote a space in the final string. ie:
-
- Please Enter Your Phone Number: (403) 123-4567
-
- will be returned in NewIn as 4031234567. The pattern would have resembled
- the example above.
-
- ** NOTE ** There are functions/procedures required to run this procedure.
- They are:
- GetCursor (not necessary)
- SetCursor (not necessary)
- WriteP (pattern-writing routine, see next few
- posts, is necessary)
-
- A demo program is included at the bottom of the message.
-
- *)
-
- (* Standard disclaimer: I'm not liable for anything this procedure does
- outside the original purpose of the procedure. If
- something bad happens, let me know, but that's all
- I can do.
- *)
-
- Var
- CurX, StLen, PatX, NumXs, MaxLen,
- Tmp : Byte;
- DefChars : Set Of Char;
- OldCursor : Word;
-
- Begin
- Tmp := 0;
- For I := 1 To Length (Patrn) Do
- If Patrn[I] = 'X' Then
- Inc (Tmp);
- If Length (OldIn) > Length (Patrn)-Tmp Then
- OldIn := Copy (OldIn,1,Length (Patrn)-Tmp);
- WriteP (OldIn,X,Y,HiColr,FChar,Patrn);
- InStr := OldIn;
- StLen := Length (OldIn);
- NumXs := 0;
- For I := 1 To StLen Do
- If Patrn[I] = 'X' Then
- Inc (NumXs);
- CurX := StLen+X+NumXs;
- PatX := StLen+NumXs+1;
- If PatX = 0 Then
- Begin
- PatX := 1;
- CurX := X;
- End;
- DefChars := ValidChars;
- MaxLen := Length (Patrn);
- OldCursor := GetCursor;
- Repeat
- If PatX = 0 Then
- Begin
- PatX := 1;
- CurX := X;
- End;
- While Patrn[PatX] = 'X' Do
- Begin
- Inc (PatX);
- Inc (CurX);
- End;
- NumXs := 0;
- For I := 1 To PatX Do
- If Patrn[I] = 'X' Then
- Inc (NumXs);
- If InsOn Then
- SetCursor (DefaultCursor)
- Else
- SetCursor (BlockCursor);
- GotoXY (CurX,Y);
- Case Patrn[PatX] Of
- '#': ValidChars := NumChars;
- '@': ValidChars := AlphaChars;
- '%': ValidChars := NumChars + AlphaChars;
- End;
- ValidChars := ValidChars + [#8,#13,#210,#211] + HKeySet + FuncKeys +
- MenuKeys + ArrowKeys;
- Repeat
- Ch := ReadKey;
- Until Ch In ValidChars;
- SetCursor (OldCursor);
- Case Ch Of
- #8:
- Begin
- If PatX >= 2 Then
- Begin
- If Patrn[PatX-1] = 'X' Then
- Begin
- While (Patrn[PatX-1] = 'X') And (PatX > 1) Do
- Begin
- Dec (PatX);
- Dec (CurX);
- End;
- Dec (PatX);
- Dec (CurX);
- End
- Else
- Begin
- Dec (CurX);
- Dec (PatX);
- End;
- If (CurX >= X) And (Length (InStr) > 0) Then
- Begin
- NumXs := 0;
- For I := 1 To PatX Do
- If Patrn[I] = 'X' Then
- Inc (NumXs);
- Delete (InStr,PatX-NumXs,1);
- End;
- End;
- End;
- #203: { Left arrow }
- Begin
- If CurX > X Then
- If Patrn[PatX-1] <> 'X' Then
- Begin
- Dec (CurX);
- Dec (PatX);
- End
- Else
- Begin
- While Patrn[PatX-1] = 'X' Do
- Begin
- Dec (CurX);
- Dec (PatX);
- End;
- Dec (CurX);
- Dec (PatX);
- End;
- If PatX < 1 Then
- Begin
- CurX := X;
- PatX := 1;
- End;
- End;
- #205: { Right arrow }
- If PatX-NumXs <= Length (InStr) Then
- If Patrn[PatX+1] <> 'X' Then
- Begin
- Inc (CurX);
- Inc (PatX);
- End
- Else
- Begin
- Inc (CurX);
- Inc (PatX);
- While Patrn[PatX] = 'X' Do
- Begin
- Inc (CurX);
- Inc (PatX);
- End;
- End;
- #199: { Home }
- Begin
- CurX := X;
- PatX := 1;
- End;
- #207: { End }
- Begin
- PatX := Length (InStr)+1;
- For I := 1 To PatX Do
- If Patrn[I] = 'X' Then
- Inc (PatX);
- CurX := PatX+X-1;
- End;
- #210: { Insert }
- InsOn := InsOn XOr True;
- #211: { Delete }
- Delete (InStr,PatX-NumXs,1);
- #65..#90,
- #97..#122, { Alphabet }
- #48..#57, { Numbers }
- #91..#96,
- #32..#47,
- #58..#64: { Other chars }
- Begin
- If (CurX-X < MaxLen) And (((Length (InStr) < MaxLen) And
- (InsOn)) Or ((Not InsOn))) Then
- Begin
- If InsOn Then
- Insert (Ch,InStr,PatX-NumXs)
- Else
- Begin
- If PatX-NumXs > Length (InStr) Then
- Insert (Ch,InStr,PatX-NumXs)
- Else
- InStr[PatX-NumXs] := Ch;
- End;
- Inc (CurX);
- Inc (PatX);
- End;
- End;
- End;
- If Length (InStr) > Length (Patrn) Then
- InStr[0] := Chr (Length (Patrn));
- WriteP (InStr,X,Y,Colr,FChar,Patrn);
- Until (Ch = #13) Or (Ch = #27);
- If Ch = #27 Then
- NewIn := '';
- If Ch = #13 Then
- NewIn := InStr;
- End;